#include <iostream>
#include <thread>
#include <semaphore>
using namespace std;
int num{1};
std::counting_semaphore<1> sem(1); // 计数信号量，初始值为1
void foo()
{
    sem.acquire(); // 获取信号量
    this_thread::sleep_for(chrono::milliseconds(2));
    num++;
    sem.release(); // 释放信号量
}
void bar()
{
    sem.acquire(); // 获取信号量
    this_thread::sleep_for(chrono::milliseconds(2));
    num *= 2;
    sem.release(); // 释放信号量
}
int main()
{
    thread t1(foo);
    thread t2(bar);
    t1.join();
    t2.join();
    cout << num << endl;
    return 0;
}
// 信号量(semaphore)是一种用于控制对共享资源访问的同步原语
// 信号量维护一个计数器，表示可用资源的数量
// 当一个线程想要访问受保护的资源时，它必须先获取信号量
// 如果信号量的计数器大于零，线程可以继续执行，并将计数器减一
// 如果计数器为零，线程将被阻塞，直到有其他线程释放信号量
// 释放信号量会将计数器加一，并可能唤醒一个等待的线程
// C++20 引入了 std::counting_semaphore 和 std::binary_semaphore 来支持信号量
// std::counting_semaphore 可以有多个资源，而 std::binary_semaphore 只有两个状态（0 和 1）
// 信号量常用于限制对资源的并发访问，例如连接池